/*
计算序列 2/1+3/2+5/3+8/5+..的前N项之和。注意该序列从第2项起，每一项的分子是前一项分子与分母的和，分母
是前一项的分子。
输入在一行中给出一个正整数N。
在一行中输出部分和的值，精确到小数点后2位。题目保证计算结果不超过双精度范围。
*/
#include<stdio.h>
//易发现,分子分母都是斐波那契数列的项,以下定义一个递归函数,它能够得到斐波那契数列的每一项 
/*
double recursion(int n){
	if(n==0){
		return 1;
	}
	else if(n==1){
		return 1;
	}
	else{
		return recursion(n-1)+recursion(n-2);
	}
}
*/
//递归函数的缺点是吃性能,可以通过循环来实现递归一样的效果,以下是上面递归函数的优化版 
double fibonacci(int n){
	if(n==0){
		return 1;
	}
	if(n==1){
		return 1;
	}
	int a=1, b=1,c;
	for(int i=2;i<=n;i++){
		c=a+b;
		a=b;
		b=c;
	}
	return b;
}
 
 /*
 注意,函数的返回类型要用double而不是int,因为斐波那契数列的增长速度很快,随着项数的增大,return的值会超出int的上限,导致函数返回值出错,代码能正常运行,但是输出的结果会出问题
此外,如果返回值是int类型,由于后面要做fibonacci(i+1)/fibonacci(i)这样的除法,两个int类型的数做除法,结果也会是int类型,导致结果中的小数部分会被舍去,不能得到预期结果
*/

int main(){
	int i=1;
	int N;
	printf("Please give a number of N:");
	scanf("%d",&N);
	double sum=0;
	double item;
	for(i;i<=N;i++){
		item=fibonacci(i+1)/fibonacci(i);//表示出序列每一项的通式 
		sum+=item;
	}
	printf("%.2lf",sum);
	return 0;
	
}
